// class PersonClass {
//   // 构造函数
//   constructor (name) {
//     this.name = name
//   }
//   // 定义方法
//   sayName () {
//     console.log(this.name)
//   }
// }

// const person = new PersonClass('张三')
// person.sayName() // 张三

// console.log(typeof PersonClass) // function
// console.log(typeof PersonClass.prototype.sayName) // function

// PersonClass = 'FooPerson'
// console.log(PersonClass)


// const PersonClass = class {
//   // 构造函数
//   constructor (name) {
//     this.name = name
//   }
//   // 定义方法
//   sayName () {
//     console.log(this.name)
//   }
// }
// const person = new PersonClass('张三')
// person.sayName() // 张三

// const PersonClass = class PersonClass2 {
//   // 构造函数
//   constructor (name) {
//     this.name = name
//   }
//   // 定义方法
//   sayName () {
//     console.log(this.name)
//   }
// }

// function createObj (classDef, name) {
//   const obj = new classDef(name)
//   obj.sayName()
// }
// createObj(PersonClass, '李四') // 李四

// const personClass = new class {
//   // 构造函数
//   constructor (name) {
//     this.name = name
//   }
//   // 定义方法
//   sayName () {
//     console.log(this.name)
//   }
// }('张三')
// personClass.sayName() // 张三

// const methodName = 'sayName'
// class PersonClass {
//   // 构造函数
//   constructor (name) {
//     this.name = name
//   }
//   [methodName] () {
//     console.log(this.name)
//   }
// }
// const person = new PersonClass('张三')
// person.sayName() // 张三

// class MyClass {
//   *createIterator () {
//     yield 1
//     yield 2
//     yield 3
//   }
// }
// const iteratance = new MyClass()
// const iterator = iteratance.createIterator()
// console.log(iterator.next()) // { value: 1, done: false }
// console.log(iterator.next()) // { value: 2, done: false }
// console.log(iterator.next()) // { value: 3, done: false }

// class Collection {
//   constructor () {
//     this.items = []
//   }
//   *[Symbol.iterator] () {
//     yield *this.items.values()
//   }
// }
// const collection = new Collection()
// collection.items.push(1)
// collection.items.push(2)
// collection.items.push(3)
// for (let x of collection) {
//   console.log(x)
// }
// // 1
// // 2
// // 3


// class MyMath {
//   static getPi () {
//     return Math.PI
//   }
// }
// console.log(MyMath.getPi()) // 3.141592653589793

// class ReactRang {
//   constructor (length, width) {
//     this.length = length
//     this.width = width
//   }
//   getArea () {
//     return this.length * this.width
//   }
// }

// class Square extends ReactRang {
//   constructor (length) {
//     super(length, length)
//     this.squareLength = length
//   }
//   getArea () {
//     return `square area is：${this.squareLength * this.squareLength}`
//   }
// }

// const square = new Square(3)
// console.log(square.getArea()) // square area is：9


class Shape {
  constructor () {
    if (new.target === Shape) {
      throw new Error('Shape类不可以被实例化！')
    }
  }
}
new Shape() // Error: Shape类不可以被实例化！